/*
 *  Copyright (c) 2011-2016 The original author or authors
 *  ------------------------------------------------------
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  and Apache License v2.0 which accompanies this distribution.
 *
 *       The Eclipse Public License is available at
 *       http://www.eclipse.org/legal/epl-v10.html
 *
 *       The Apache License v2.0 is available at
 *       http://www.opensource.org/licenses/apache2.0.php
 *
 *  You may elect to redistribute this code under either of these licenses.
 */

/**
 * = Zookeeper Cluster Manager
 * 
 * This is a cluster manager implementation for Vert.x that uses http://zookeeper.apache.org/[Zookeeper].
 * 
 * It implements interfaces of vert.x cluster totally. So you can using it to instead of vertx-hazelcast if you want.
 * This implementation is packaged inside:
 * 
 * [source,xml,subs="+attributes"]
 * ----
 * <dependency>
 * <groupId>io.vertx</groupId>
 * <artifactId>vertx-zookeeper</artifactId>
 * <version>${maven.version}</version>
 * </dependency>
 * ----
 * 
 * In Vert.x a cluster manager is used for various functions including:
 * 
 * Discovery and group membership of Vert.x nodes in a cluster
 * Maintaining cluster wide topic subscriber lists (so we know which nodes are interested in which event bus
 * addresses)
 *
 * * Distributed Map support
 * * Distributed Locks
 * * Distributed Counters
 * 
 * Cluster managers *do not* handle the event bus inter-node transport, this is done directly by Vert.x with TCP connections.
 * 
 * == How to work
 * We are using http://curator.apache.org/[Apache Curator] framework rather than zookeeper client directly, so
 * we have a dependency for libraries used in Curator such as `guava`, `slf4j` and of course `zookeeper`.
 * 
 * Since ZK using tree dictionary to store data, we can take root path as namespace default root path is `io.vertx` which in default-zookeeper.json.
 * and there are another 5 sub path to record other information for functions in vert.x cluster manager, all you can change the path is `root path`.
 * 
 * you can find all the vert.x node information in path of `/io.vertx/cluster/nodes/`,
 * `/io.vertx/asyncMap/$name/` record all the `AsyncMap` you created with `io.vertx.core.shareddata.AsyncMap` interface.
 * `/io.vertx/asyncMultiMap/$name/` record all the `AsyncMultiMap` you created with `io.vertx.core.spi.cluster.AsyncMultiMap` interface.
 * `/io.vertx/locks/` record distributed Locks information.
 * `/io.vertx/counters/` record distributed Count information.
 * 
 * == Using this cluster manager
 * 
 * If you are using Vert.x from the command line, the jar corresponding to this cluster manager (it will be named `vertx-zookeeper-${maven.version}`.jar`
 * should be in the `lib` directory of the Vert.x installation.
 * 
 * If you want clustering with this cluster manager in your Vert.x Maven or Gradle project then just add a dependency to
 * the artifact: `io.vertx:vertx-zookeeper:${version}` in your project.
 * 
 * If the jar is on your classpath as above then Vert.x will automatically detect this and use it as the cluster manager.
 * Please make sure you don't have any other cluster managers on your classpath or Vert.x might
 * choose the wrong one.
 * 
 * You can also specify the cluster manager programmatically if you are embedding Vert.x by specifying it on the options
 * when you are creating your Vert.x instance, for example:
 * 
 * [source, $lang]
 * ----
 * {@link example.Examples#example1()}
 * ----
 * 
 * == Configuring this cluster manager
 * 
 * Usually the cluster manager is configured by a file
 * https://github.com/vert-x3/vertx-zookeeper/blob/master/src/main/resources/default-zookeeper.json[`default-zookeeper.json`]
 * which is packaged inside the jar.
 * 
 * If you want to override this configuration you can provide a file called `zookeeper.json` on your classpath and this
 * will be used instead. If you want to embed the `zookeeper.json` file in a fat jar, it must be located at the root of the
 * fat jar. If it's an external file, the **directory** containing the file must be added to the classpath. For
 * example, if you are using the _launcher_ class from Vert.x, the classpath enhancement can be done as follows:
 * 
 * [source]
 * ----
 * # If the zookeeper.json is in the current directory:
 * java -jar ... -cp . -cluster
 * vertx run MyVerticle -cp . -cluster
 * 
 * # If the zookeeper.json is in the conf directory
 * java -jar ... -cp conf -cluster
 * ----
 * 
 * Another way to override the configuration is by providing the system property `vertx.zookeeper.conf` with a
 * location:
 * 
 * [source]
 * ----
 * # Use a cluster configuration located in an external file
 * java -Dvertx.zookeeper.config=./config/my-zookeeper-conf.json -jar ... -cluster
 * 
 * # Or use a custom configuration from the classpath
 * java -Dvertx.zookeeper.config=classpath:my/package/config/my-cluster-config.json -jar ... -cluster
 * ----
 * 
 * The `vertx.zookeeper.config` system property, when present, overrides any `zookeeper.json` from the classpath, but if
 * loading
 * from this system property fails, then loading falls back to either `zookeeper.json` or the Zookeeper default configuration.
 * 
 * The configuration file is described in detail in `default-zookeeper.json`'s comment.
 * 
 * You can also specify configuration programmatically if embedding:
 * 
 * [source,java]
 * ----
 * {@link example.Examples#example2()}
 * ----
 *
 * IMPORTANT: You can also configure the zookeeper hosts using the `vertx.zookeeper.hosts` system property.
 * 
 * === Enabling logging
 * 
 * When trouble-shooting clustering issues with Zookeeper it's often useful to get some logging output from Zookeeper
 * to see if it's forming a cluster properly. You can do this (when using the default JUL logging) by adding a file
 * called `vertx-default-jul-logging.properties` on your classpath. This is a standard java.util.logging (JUL)
 * configuration file. Inside it set:
 * 
 * ----
 * org.apache.zookeeper.level=INFO
 * ----
 * 
 * and also
 * 
 * ----
 * java.util.logging.ConsoleHandler.level=INFO
 * java.util.logging.FileHandler.level=INFO
 * ----
 * 
 * == About Zookeeper version
 * We use Curator ${curator.version}, as Zookeeper latest stable is 3.4.8 so we do not support any features of 3.5.x
 */


@Document(fileName = "index.adoc")
package io.vertx.spi.cluster.zookeeper;

import io.vertx.docgen.Document;
